今天我們會初始化一個簡單的 websocket server,然後結尾會提到一些 python asyncio 的使用細節。
一開始在 google 下關鍵字「python websocket server example」,首先映入眼簾的會是以下幾篇文章:
會發現大部分的實作都是基於 websockets ,同時該套件最後一次更新時間為 May 7, 2023
這表示作者還有持續維護,是值得選用的套件。
而且第二篇文章就是 websockets 官方文檔提供的教程,內容也十分完整,很值得自己跟著一起動手做。如果嫌內容太多的話,可以參考 Quick start
今天我們也會以 Quick start 作為基礎來開始
後面的文章如果有細心看的話,會發現第三篇的寫法跟 Quick start 有點點不太一樣,這個後續會再提到
記得要確認 python 版本為 3.7 以上,這樣子使用 websockets
才不會出問題。
接下來我們就是複製 Quick start 提供的範例,並且執行內容。這邊也有幫大家把範例檔都下載到這裡,clone 下來就可以執行了
第一組範例:server.py, client.py
client 設定好 name 之後發送自己的 name 給 server,然後 server 收到之後回應 hello ${name}
第二組範例:show_time.html, show_time.js, show_time.py
因為前一組的範例是純粹在 python 上完成,這組範例則是可以跑在 browser 上。
第三篇文章的範例中我們可以看到asyncio.get_event_loop().run_until_complete(...)
asyncio.get_event_loop().run_forever()
這種寫法,在 python 3.10 版本之後已經被標註遺棄,所以在執行的時候可能會看到 DeprecationWarning: There is no current event loop
之類的字樣
要改成以下寫法才不會跳警告
async def main():
async with websockets.serve(coroutine, "localhost", 8765):
await asyncio.Future() # run forever
if __name__ == "__main__":
asyncio.run(main())
今天我們看了網路上排名比較前面的實作範例,透過 Quick start 作為我們專案練習的基礎,同時也提醒一下 asyncio 在高版本會遇到的一些問題
明天我們會在這個範例的基礎之上,再陸續加上遊戲需要的機制,敬請期待!